توابعی که ISkinned<Fruit>
را می پذیرند, فقط ISkinned<Fruit>
را میپذیرند
تا حالا به کلمات in و out که تو بعضی جنریکها هست دقت کردید؟ اصن چه معنی دارن و اگر نباشن چه فرقی میکنن؟
کد زیر رو در نظر بگیرید
class Fruit {}
class Banana : Fruit {}
interface ICovariantSkinned<out T> {}
interface ISkinned<T> {}
و حالا توابع زیر
void Peel(ISkinned<Fruit> skinned) { }
void Peel(ICovariantSkinned<Fruit> skinned) { }
تابعی که ICovariantSkinned<Fruit>
را می پذیرد می تواند ICovariantSkinned<Fruit>
یا ICovariantSkinned<Banana>
را بپذیرد زیرا ICovariantSkinned<T>
یک رابط کوواریانت و Banana
یک نوع Fruit
است.
توابعی که ISkinned<Fruit>
را می پذیرند, فقط ISkinned<Fruit>
را میپذیرند